#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
帧处理模块
负责处理视频帧的显示和更新相关操作
"""

from PySide6.QtCore import Qt
from PySide6.QtGui import QImage, QPixmap
from src.config import Config


class FrameHandler:
    """帧处理器类"""

    def __init__(self):
        """初始化帧处理器"""
        pass

    def update_frame(self, main_window):
        """
        更新视频帧（定时器回调）
        
        这个方法现在由FFmpeg播放器通过信号机制处理，
        不再需要手动读取帧数据。
        
        Args:
            main_window (VideoStitcherMainWindow): 主窗口实例
        """
        # 这个方法现在由FFmpeg播放器的信号处理
        # 保留此方法以保持兼容性
        pass

    def display_frame(self, main_window, qimage: QImage):
        """
        显示视频帧
        
        接收QImage并在视频标签上显示，同时进行适当的缩放。
        
        Args:
            main_window (VideoStitcherMainWindow): 主窗口实例
            qimage (QImage): 要显示的图像
        """
        try:
            # 转换为QPixmap并显示
            main_window.current_frame_pixmap = QPixmap.fromImage(qimage)
            scaled_pixmap = main_window.current_frame_pixmap.scaled(
                main_window.video_label.size(), 
                Qt.KeepAspectRatio, 
                Qt.SmoothTransformation
            )
            main_window.video_label.setPixmap(scaled_pixmap)
        except Exception as e:
            print(f"显示帧时出错: {e}")

    def update_position(self, main_window, position: float):
        """
        更新播放位置
        
        更新时间显示和进度滑块位置。
        
        Args:
            main_window (VideoStitcherMainWindow): 主窗口实例
            position (float): 当前播放位置（秒）
        """
        try:
            main_window.current_time = position
            duration = main_window.ffmpeg_player.get_duration()
            
            if duration > 0:
                slider_value = int((position / duration) * 1000)
                # 避免滑块值更新时触发信号
                main_window.progress_slider.blockSignals(True)
                main_window.progress_slider.setValue(slider_value)
                main_window.progress_slider.blockSignals(False)
                
            main_window.update_time_display(position, duration)
        except Exception as e:
            print(f"更新位置时出错: {e}")

    def handle_playback_finished(self, main_window):
        """
        处理播放结束
        
        Args:
            main_window (VideoStitcherMainWindow): 主窗口实例
        """
        main_window.is_playing = False
        main_window.play_pause_button.setText(Config.PLAY_BUTTON_TEXT)

    def show_frame_at_time(self, main_window, time_seconds: float):
        """
        在指定时间点显示视频帧
        
        使用FFmpeg播放器跳转到指定时间并显示帧。
        
        Args:
            main_window (VideoStitcherMainWindow): 主窗口实例
            time_seconds (float): 要显示的帧的时间位置（秒）
        """
        try:
            if main_window.ffmpeg_player.video_path:
                # 使用FFmpeg播放器跳转到指定时间
                main_window.ffmpeg_player.seek(time_seconds)
            else:
                main_window.video_label.setText("没有加载视频")
        except Exception as e:
            main_window.video_label.setText(f"显示帧时出错: {str(e)}")